home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utilsys / rss14gmd.lha / RSys_1.4gmd / C / Clip.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  4KB  |  189 lines

  1. /*
  2.    ***************************************************************************
  3.    *
  4.    * Datei:
  5.    *      RSysClip.c
  6.    *
  7.    * Inhalt:
  8.    *
  9.    *      --- Globale Routinen ---
  10.    *
  11.    *    void RSysEntryToClip ( void );
  12.    *    void RSysListToClip ( void );
  13.    *    void SaveListToClip ( LIST *list , char *text );
  14.    *
  15.    *      --- Lokale  Routinen ---
  16.    *
  17.    *
  18.    * Bemerkungen:
  19.    *      Unterstützung des ClipBoard-Devices.
  20.    *
  21.    * Erstellungsdatum:
  22.    *      07-Jul-93     Rolf Böhme
  23.    *
  24.    * Änderungen:
  25.    *      07-Jul-93     Rolf Böhme        Erstellung
  26.    *
  27.    ***************************************************************************
  28.  */
  29.  
  30. #include "RSys.h"
  31. #include "protos.h"
  32.  
  33. void
  34. SaveListToClip (LIST * list, char *text)
  35. {
  36.   char Success = FALSE;
  37.   NODE *node;
  38.   int len;
  39.   IFFHANDLE *Handle;
  40.  
  41.   DPOS;
  42.  
  43.   if (IFFParseBase = OpenLibrary ((UBYTE *) "iffparse.library", 0L))
  44.     {
  45.       if (Handle = AllocIFF ())
  46.     {
  47.       if (Handle->iff_Stream = (ULONG) OpenClipboard (PRIMARY_CLIP))
  48.         {
  49.           InitIFFasClip (Handle);
  50.  
  51.           if (!OpenIFF (Handle, IFFF_WRITE))
  52.         {
  53.           if (!PushChunk (Handle, ID_FTXT, ID_FORM, IFFSIZE_UNKNOWN))
  54.             {
  55.               if (!PushChunk (Handle, 0, ID_CHRS, IFFSIZE_UNKNOWN))
  56.             {
  57.               if (list != NULL)
  58.                 {
  59.                   for (node = list->lh_Head; node->ln_Succ; node = node->ln_Succ)
  60.                 {
  61.                   len = strlen (node->ln_Name);
  62.  
  63.                   if (WriteChunkBytes (Handle, node->ln_Name, len) != len)
  64.                     break;
  65.  
  66.                   if (WriteChunkBytes (Handle, "\n", 1) != 1)
  67.                     break;
  68.                 }
  69.                 }
  70.               else
  71.                 {
  72.                   len = strlen (text);
  73.  
  74.                   if (WriteChunkBytes (Handle, (STRPTR) text, len) != len)
  75.                 Success = FALSE;
  76.                 }
  77.  
  78.               if (!PopChunk (Handle))
  79.                 Success = TRUE;
  80.             }
  81.             }
  82.  
  83.           if (Success)
  84.             if (PopChunk (Handle))
  85.               Success = FALSE;
  86.  
  87.           CloseIFF (Handle);
  88.         }
  89.  
  90.           CloseClipboard ((CLIPBOARDHANDLE *) Handle->iff_Stream);
  91.         }
  92.  
  93.       FreeIFF (Handle);
  94.     }
  95.  
  96.       CloseLibrary (IFFParseBase);
  97.     }
  98.   else
  99.     ErrorHandle ("iffparse.library", LIBRARY_ERR, OPEN_FAIL, NO_KILL);
  100.  
  101.   if (!Success)
  102.     ErrorHandle ("Unit 0", CLIPBOARD_ERR, WRITE_FAIL, NO_KILL);
  103.  
  104.   return;
  105. }
  106.  
  107. void
  108. RSysListToClip (void)
  109. {
  110.   HandleHelp (MN_RSysListToClip);
  111.  
  112.   PrintInfo ("Saving List to clipboard", SPEAK, 0);
  113.  
  114.   SaveListToClip (&ListeLVList, NULL);
  115.  
  116.   PrintStatistics ();
  117.  
  118.   return;
  119. }
  120.  
  121. void
  122. RSysEntryToClip (void)
  123. {
  124.   INTUIMESSAGE *message;
  125.   APTR object;
  126.   ULONG class, code;
  127.  
  128.   DPOS;
  129.  
  130.   HandleHelp (MN_RSysEntryToClip);
  131.  
  132.   Flags.quit_clip = 0;
  133.  
  134.   PrintInfo ("Select list entry (ESC to cancel)", SPEAK, 0);
  135.  
  136.   do
  137.     {
  138.       /*
  139.        * Warten auf folgende Events:
  140.        * - ^C wurde eingegeben
  141.        * - Events vom Hauptfenster
  142.        */
  143.       Wait (1L << SysWnd->UserPort->mp_SigBit);
  144.  
  145.       while ((message = (INTUIMESSAGE *) GT_GetIMsg (SysWnd->UserPort)) != NULL)
  146.     {
  147.       /*
  148.        * Die wichtigsten Daten werden aus der erhaltenen
  149.        * Nachricht kopiert.
  150.        */
  151.       object = message->IAddress;
  152.       class = message->Class;
  153.       code = message->Code;
  154.  
  155.       /*
  156.        * Die Nachricht wird sofort beantwortet, damit
  157.        * Intuition nicht länger als notwendig auf eine
  158.        * Antwort wartet.
  159.        */
  160.       GT_ReplyIMsg (message);
  161.  
  162.       if (class == IDCMP_GADGETUP)
  163.         {
  164.           if (((GADGET *) object)->GadgetID == GD_ListeLV)
  165.         {
  166.           NODE *node;
  167.  
  168.           if (node = GetNode (&ListeLVList, code))
  169.             {
  170.               SaveListToClip (NULL, node->ln_Name);
  171.               Flags.quit_clip = 1;
  172.             }
  173.         }
  174.         }
  175.  
  176.       if ((class == IDCMP_VANILLAKEY) && (code == ESC))
  177.         {
  178.           Flags.quit_clip = 1;
  179.           PrintInfo ("Selection aborted!", SPEAK, SEC);
  180.         }
  181.     }
  182.     }
  183.   while (NOT (Flags.quit_clip));
  184.  
  185.   PrintStatistics ();
  186.  
  187.   return;
  188. }
  189.